#!/bin/bash
# mysql8 快捷docker安装运行
function nacosTemp() {
  echo "=========================================================="
  echo "========================nacos============================="
  echo "=========================================================="
  nacos_user="nacos_user"
  nacos_user_password="nacos"
  nacos_config="nacos_config"

  container_name="${asName}"
  container_ip=$(docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' "${container_name}")
  echo "Container IP: $container_ip"

  echo docker exec -i "${asName}" mysql -h$container_ip -uroot -p$MYSQL_ROOT_PASSWORD -e "DROP DATABASE IF EXISTS $nacos_config;"
  echo docker exec -i "${asName}" mysql -h$container_ip -uroot -p$MYSQL_ROOT_PASSWORD -e "CREATE DATABASE $nacos_config CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;"
  echo docker exec -i "${asName}" mysql -h$container_ip -uroot -p$MYSQL_ROOT_PASSWORD -e "CREATE USER '${nacos_user}'@'%' IDENTIFIED BY '${nacos_user_password}';"
  echo docker exec -i "${asName}" mysql -h$container_ip -uroot -p$MYSQL_ROOT_PASSWORD $nacos_config <nacos_config.sql

  docker exec -i "${asName}" mysql -h$container_ip -uroot -p$MYSQL_ROOT_PASSWORD -e "DROP DATABASE IF EXISTS $nacos_config;"
  docker exec -i "${asName}" mysql -h$container_ip -uroot -p$MYSQL_ROOT_PASSWORD -e "CREATE DATABASE $nacos_config CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;"
  docker exec -i "${asName}" mysql -h$container_ip -uroot -p$MYSQL_ROOT_PASSWORD -e "CREATE USER '${nacos_user}'@'%' IDENTIFIED BY '${nacos_user_password}';"
  docker exec -i "${asName}" mysql -h$container_ip -uroot -p$MYSQL_ROOT_PASSWORD $nacos_config <nacos_config.sql
  echo "=========================================================="
  echo "nacos 数据库预留nacos_config  用户名:${nacos_user} 密码:${nacos_user_password}"
  echo "=========================================================="
}

# 创建目录并移动脚本的函数
function createStart() {
  local dockerVolumes="$1"
  local name="$2"
  local port="$3"
  local scriptName="${name}.sh"
  local destination="/${dockerVolumes}/${name}/${port}"
  rm -rf "${destination}"
  # 为脚本添加执行权限
  chmod +x "${scriptName}"

  # 使用 mkdir -p 创建父目录（如果不存在）
  mkdir -p "${destination}"

  # 删除已存在的脚本文件
  [ -f "/${dockerVolumes}/${name}/${scriptName}" ] && rm -rf "/${dockerVolumes}/${name}/${scriptName}"

  # 在移动之前检查脚本文件是否存在
  if [ -f "${scriptName}" ]; then
    cp "${scriptName}" "/${dockerVolumes}/${name}/"
    cp "nacos_config.sql" "/${dockerVolumes}/${name}/"
    #nacos_config
    echo "脚本 '${scriptName}' 已复制到 '/${dockerVolumes}/${name}/'"
  else
    echo "错误：当前目录中找不到脚本 '${scriptName}'"
    exit 1
  fi
}

function dockerCreateStart() {
  name="$1"
  version="$2"
  asName="$3"
  portMap=$4
  volumesMap=$5
  dockerMap=$6
  copyDockerMap=$7
  lastDockerMap=$8

  # 取消注释以下一行，如果想要拉取 Docker 镜像
  #docker pull "${name}:${version}"

  # 删除同名容器
  docker rm -f "${asName}" &>/dev/null

  dockerRun="docker run"
  dockerRunTemp="docker run"

  # 添加端口映射参数
  for element in "${portMap[@]}"; do
    dockerRun+=" -p $element"
    dockerRunTemp+=" -p $element"
  done

  # 添加其他 Docker 参数
  for element in "${dockerMap[@]}"; do
    dockerRun+=" $element"
    dockerRunTemp+=" $element"
  done

  # 添加卷映射参数
  for element in "${volumesMap[@]}"; do
    dockerRun+=" -v $element"
    # dockerRunTemp+=" -v $element"
  done

  dockerRun+=" ${name}:${version}"
  dockerRunTemp+=" ${name}:${version}"

  for element in "${lastDockerMap[@]}"; do
    dockerRun+=" $element"
    dockerRunTemp+=" $element"
  done
  echo "$dockerRunTemp " #${name}:${version}
  $dockerRunTemp         #"${name}:${version}"

  echo "复制 开始"
  # 复制 Docker 映射文件
  for element in "${copyDockerMap[@]}"; do
    echo "复制 $element"
    IFS=':' read -r source dest <<<"$element"
    echo "docker cp ${asName}:${source} ${dest}"
    docker cp "${asName}":"${source}" "${dest}"
  done

  echo "复制 完成"
  # 删除同名容器
  docker rm -f "${asName}" &>/dev/null
  echo "正式启动挂载"
  echo "$dockerRun " #${name}:${version}
  $dockerRun         #"${name}:${version}"

  #read -r -p "查看 $name 运行日志?【Y/N】" input
  #if[ "$input,," =~ ^(YES|Y)$ ];then
  #    docker logs -f -t ${asName}
  #else
  #    echo ""
  #fi

}

function main() {
    # 默认值
    networkName="common-network"
    dockerVolumes="docker-volumes"
    #镜像名
    name="mysql"
    #别名
    asName="mysql8"
    #版本
    version="8.0.27"
    port="3306"
    portMap=("$port:3306")
    #挂载地址
    v0="/etc/localtime:/etc/localtime"
    v1="/$dockerVolumes/$name/$port/conf:/etc/mysql/conf.d"
    v2="/$dockerVolumes/$name/$port/logs:/logs"
    v3="/$dockerVolumes/$name/$port/data:/var/lib/mysql"
    volumesMap=("$v0" "$v1" "$v2" "$v3")
    MYSQL_ROOT_PASSWORD="root"
    #环境配置
    dockerMap=("--restart=always" "-d" "--name=${asName}" "--network=${networkName}")
    dockerMap+=("--privileged=true")
    dockerMap+=("-e MYSQL_ROOT_PASSWORD=$MYSQL_ROOT_PASSWORD")
    lastDockerMap=("--character-set-server=utf8mb4")
    lastDockerMap+=("--collation-server=utf8mb4_unicode_ci")
    #容器地址:宿主机地址
    cp1="/etc/mysql/conf.d:/$dockerVolumes/$name/$port/conf"
    cp2="/logs:/$dockerVolumes/$name/$port/logs"
    cp3="/var/lib/mysql:/$dockerVolumes/$name/$port/data"
    copyDockerMap=("$cp1" "$cp2" "$cp3")
    #-v $PWD/mysql/conf:/etc/mysql/conf.d \
    #-v $PWD/mysql/logs:/logs \
    #-v $PWD/mysql/data:/var/lib/mysql \
    #-e MYSQL_ROOT_PASSWORD=root \

    # 输出关于设置的信息
    echo "============================================="
    echo "        ${name} Docker 安装挂载启动          "
    echo "============================================="
    docker network create "$networkName"
    # 使用 createStart 函数创建挂载目录
    echo "创建挂载目录..."
    createStart "${dockerVolumes}" "${name}" "${port}"

    # 使用 dockerCreateStart 函数运行 Docker 容器
    dockerCreateStart "${name}" "${version}" "${asName}" $portMap $volumesMap $dockerMap $copyDockerMap $lastDockerMap

    echo "============================================="
    echo "        ${name} Docker 安装挂载启动成功         "
    echo "============================================="
    for element in "${volumesMap[@]}"; do
      echo "        ${asName} Docker 挂载目录：            "
      echo ${element}
    done
    echo "============================================="
}

main